**Day 16:
4.類型轉換和推測
(1).類型隱式轉換
運算子應用於不同變數類型時,
編譯器將會嘗試把其中一個變數轉換為其他類型
(賦值也是如此)。變數之間的隱式轉換是可實行的,
例如:uint16可以轉換為uint32,
int64可以轉換為int128,但是int128不能隱式轉換
為uint128(因為uint不能設為負數)。
Example:
pragma solidity ^0.4.24;
contract convert{
function test() public returns(int16 c){
int8 a = 1;
int16 b = 2;
c = a+b; /* a會轉換為int16 */
return c;
}
}
(2).類型顯式轉換
如果編譯器不允許隱式轉換,則必須要使用顯式轉換,
但是顯式轉換的操作可能會造成一些錯誤,在操作顯示轉換前,
務必先測試,確保結果正確。
Example:
-將負數轉換為uint
int8 y = -5;
uint x = uint(y);
-如果記憶體較大的變數被轉換為記憶體較小的變數,
則高位元的部分會被捨去
uint32 a = 0x12345678;
uint16 b = uint(a);
則 b = 0x5678;
(3).推測變數類型
當使用var宣告變數時,var會自動推測變數類型,
但是不可以作為函數的參數。
var a = 32;
注意:var偶爾會做出錯誤推斷。
另一整使用方式,可將函數設為var變數。
Example:
function a(uint x) returns (uint){
return x * 2;
}
var b = a;
b(22); /* 呼叫函數 */
5.時間和貨幣的單位
(1).時間
如果需要進行日期計算,需要注意,
對於時間的處理應盡量使用小於或大於。
時間單位: seconds , minutes , hours , days , weeks , years ,
Default為seconds,時間單位均可作為後綴。
-時間後綴不能直接應用於變數,必須以範例的方式使用
Example:
uint a = 1;
uint b = a * 1 days; /* b為86400 , 1天 == 86400秒 */
uint c = a * 1 seconds; /* c為1 */
(2).貨幣
貨幣單位使用的後綴為,wei,finney,szabo,ether,
Default為wei。
規則 :
● ether = 1000 finney;
● ether = 1000000 szabo;
● ether = 10^18 wei;
**